<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Language" content="en-ca" />
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="description" content="Targets" />
        <link rel="stylesheet" type="text/css" href="../style.css" />
        <title>NAnt - Targets</title>
    </head>
    <body>
        <table width="100%" border="0" cellspacing="0" cellpadding="2" class="NavBar">
            <tr>
                <td class="NavBar-Cell">
                    <a title="NAnt home page" href="http://nant.sourceforge.net"><b>NAnt</b></a> <img src="../images/arrow.gif" alt="-&gt;" width="13" height="9" />
                    <a href="../index.html">Help</a> <img alt="-&gt;" src="../images/arrow.gif" /> <a href="index.html">
                        Fundamentals</a> <img height="9" alt="-&gt;" src="../images/arrow.gif" width="13" />
                    Targets
                </td>
                <td class="NavBar-Cell" align="right">
                    v0.91
                </td>
            </tr>
        </table>
        <h1>Targets</h1>
        
        <p>A target has these attributes:</p>
        <div class="table">
            <table>
                <colgroup>
                    <col />
                    <col />
                    <col style="text-align: center;" />
                </colgroup>
                <tbody>
                    <tr>
                        <th>
                            Attribute</th>
                        <th>
                            Description</th>
                        <th>
                            Required</th>
                    </tr>
                    <tr>
                        <td>name</td>
                        <td>The name of the target.</td>
                        <td>Yes</td>
                    </tr>
                    <tr>
                        <td>depends</td>
                        <td>A comma-separated list of names of targets on which this target depends.</td>
                        <td>No</td>
                    </tr>
                    <tr>
                        <td>if</td>
                        <td>An expression that should evaluate to <b>true</b> in order for this target to 
                            execute.</td>
                        <td>No</td>
                    </tr>
                    <tr>
                        <td>unless</td>
                        <td>An expression that, when evaluated to <b>true</b>, will cause the target to be 
                            skipped.</td>
                        <td>No</td>
                    </tr>
                    <tr>
                        <td>description</td>
                        <td>A short description of this target's function.</td>
                        <td>No</td>
                    </tr>
                </tbody>
            </table>
        </div>
        <p>
            The optional <code>description</code> attribute can be used to provide a 
            one-line description of this target, which is printed by the <code style="whitespace: nowrap;">
                -projecthelp</code> command-line option.</p>
        <h3><a id="dependencies" />Dependencies</h3>
        <p>
            A target can depend on other targets.&nbsp; You might have a target for 
            compiling, for example, and a target for creating a distributable.&nbsp; You 
            can only build a distributable when you have compiled first, so the distribute 
            target <em>depends on</em> the compile target.&nbsp; NAnt resolves these 
            dependencies.</p>
        <p>
            NAnt tries to execute the targets in the <code>depends</code> attribute in the 
            order they appear from left to right.&nbsp; It is possible that a target can 
            get executed earlier when an earlier target depends on it:</p>
        <pre class="code">
    &lt;target name="A"/&gt;
    &lt;target name="B" depends="A" /&gt;
    &lt;target name="C" depends="B" /&gt;
    &lt;target name="D" depends="C,B,A" /&gt;
        </pre>
        <p>
            Suppose we want to execute target D.&nbsp; From its <code>depends</code> attribute, 
            you might think that first target C, then B and then A is executed.&nbsp; 
            Wrong!&nbsp; C depends on B, and B depends on A, so first A is executed, then 
            B, then C, and finally D.</p>
        <p>
            A target gets executed only once, even when more than one target depends on it 
            (see the previous example). However, when the <a href="../tasks/call.html">&lt;call&gt;</a>
            task is used to execute a target, both the target and all its dependent targets 
            will be re-executed.</p>
        <h3><a id="wild-targets" />Wild Targets</h3>
        <p>
            A target can be marked as <i>wild</i> by setting the <code>name</code> attribute 
            to "*". A build file can contain up to one wild target, and it is executed if 
            and only if the invoked target does not exist in the current build file.&nbsp; <i>Wild</i>
            targets let you define how to handle invalid requests, or provide generic 
            behavior for unknown targets. For example:</p>
        <pre class="code">
     &lt;target name="A" /&gt;
     &lt;target name="B" /&gt;
     &lt;target name="*" /&gt;
         </pre>
        <p>
            The last target is executed if the invoked target is neither A nor B.</p>
        <h3><a id="conditional-execution" />Conditional Execution</h3>
        <p>
            A target also has the ability to perform its execution if or unless a property 
            has been set.&nbsp; This allows, for example, better control on the building 
            process depending on the state of the system (OS, command-line property 
            defines, etc.).&nbsp; To make a target <i>sense</i> this property, you should 
            add the <code>if</code> or <code>unless</code> attribute with an expression 
            that the target should react to. For example:</p>
        <pre class="code">
    &lt;target name="build-module-A" if="${module-A-present}" /&gt;
    &lt;target name="build-own-fake-module-A" unless="${file::exists('fake-module-a.dll')}" /&gt;
        </pre>
        <p>
            If no <code>if</code> and no <code>unless</code> attribute is present, the 
            target will always be executed.</p>
        <p><b>Note:</b> the dependencies of a target are always executed before testing the 
            target's condition.</p>
    </body>
</html>
